1613
21029
Έχω μια σειρά αριθμών και χρησιμοποιώ τη μέθοδο .push () για να προσθέσω στοιχεία σε αυτήν.
Υπάρχει ένας απλός τρόπος για να αφαιρέσετε ένα συγκεκριμένο στοιχείο από έναν πίνακα;
Ψάχνω για το αντίστοιχο κάτι σαν:
array.remove (αριθμός);
Πρέπει να χρησιμοποιήσω τον πυρήνα JavaScript. Δεν επιτρέπονται πλαίσια. 
1
2
3
4
Επόμενο
Βρείτε το ευρετήριο του στοιχείου πίνακα που θέλετε να καταργήσετε χρησιμοποιώντας το indexOf και, στη συνέχεια, αφαιρέστε αυτό το ευρετήριο με συναρμολόγηση.
Η μέθοδος splice () αλλάζει τα περιεχόμενα ενός πίνακα αφαιρώντας
υπάρχοντα στοιχεία ή / και προσθήκη νέων στοιχείων.
const array = [2, 5, 9];
console.log (πίνακας);
const index = array.indexOf (5);
εάν (ευρετήριο> -1) {
array.splice (ευρετήριο, 1);
}
// πίνακας = [2, 9]
console.log (πίνακας);
Η δεύτερη παράμετρος του ματίσματος είναι ο αριθμός των στοιχείων που πρέπει να αφαιρεθούν. Σημειώστε ότι το splice τροποποιεί τον πίνακα στη θέση του και επιστρέφει έναν νέο πίνακα που περιέχει τα στοιχεία που έχουν αφαιρεθεί.
Για λόγους πληρότητας, ακολουθούν οι συναρτήσεις. Η πρώτη συνάρτηση αφαιρεί μόνο μία εμφάνιση (δηλαδή την αφαίρεση του πρώτου αγώνα του 5 από [2,5,9,1,5,8,5]), ενώ η δεύτερη συνάρτηση αφαιρεί όλες τις εμφανίσεις:
function removeItemOnce (arr, τιμή) {
var index = arr.indexOf (τιμή);
εάν (ευρετήριο> -1) {
arr.splice (ευρετήριο, 1);
}
επιστροφή arr;
}
συνάρτηση removeItemAll (arr, value) {
var i = 0;
ενώ (i  = 0; i--) {
if (πίνακας [i] === αριθμός) {
array.splice (i, 1);
}
}
Εάν θέλετε απλώς να κάνετε το στοιχείο στο ευρετήριο δεν υπάρχει πλέον, αλλά δεν θέλετε τα ευρετήρια των άλλων στοιχείων να αλλάξουν:
διαγραφή πίνακα [i];
|
Επεξεργάστηκε στις 2016 Οκτωβρίου
Κάντε το απλό, διαισθητικό και ρητό (ξυράφι Occam)
Κάντε το αμετάβλητο (η αρχική συστοιχία παραμένει αμετάβλητη)
Κάντε το με τυπικές λειτουργίες JavaScript, εάν το πρόγραμμα περιήγησής σας δεν τις υποστηρίζει - χρησιμοποιήστε polyfill
Σε αυτό το παράδειγμα κώδικα χρησιμοποιώ τη συνάρτηση "array.filter (...)" για να αφαιρέσω ανεπιθύμητα στοιχεία από έναν πίνακα. Αυτή η συνάρτηση δεν αλλάζει τον αρχικό πίνακα και δημιουργεί μια νέα. Εάν το πρόγραμμα περιήγησής σας δεν υποστηρίζει αυτήν τη λειτουργία (π.χ. Internet Explorer πριν από την έκδοση 9 ή Firefox πριν από την έκδοση 1.5), εξετάστε το ενδεχόμενο να χρησιμοποιήσετε το φίλτρο polyfill από το Mozilla.
Κατάργηση στοιχείου (κωδικός ECMA-262 Edition 5 aka oldstyle JavaScript)
τιμή var = 3
var arr = [1, 2, 3, 4, 5, 3]
arr = arr.filter (συνάρτηση (αντικείμενο) {
επιστροφή αντικειμένου! == τιμή
})
console.log (arr)
// [1, 2, 4, 5]
Κατάργηση στοιχείου (κωδικός ECMAScript 6)
ας τιμή = 3
let arr = [1, 2, 3, 4, 5, 3]
arr = arr.filter (item => item! == τιμή)
console.log (arr)
// [1, 2, 4, 5]
ΣΗΜΑΝΤΙΚΟ ECMAScript 6 "() => {}" η σύνταξη λειτουργίας βέλους δεν υποστηρίζεται καθόλου στον Internet Explorer, στο Chrome πριν από την έκδοση 45, στον Firefox πριν από την έκδοση 22 και στο Safari πριν από την 10 έκδοση. Για να χρησιμοποιήσετε τη σύνταξη ECMAScript 6 σε παλιά προγράμματα περιήγησης, μπορείτε να χρησιμοποιήσετε το BabelJS.
Κατάργηση πολλών στοιχείων (κωδικός ECMAScript 7)
Ένα επιπλέον πλεονέκτημα αυτής της μεθόδου είναι ότι μπορείτε να καταργήσετε πολλά στοιχεία
αφήστε γιαDeletion = [2, 3, 5]
let arr = [1, 2, 3, 4, 5, 3]
arr = arr.filter (item =>! forDeletion. include (αντικείμενο)
// !!! Διαβάστε παρακάτω σχετικά με τη συστοιχία. Περιλαμβάνει (...) υποστήριξη !!!
console.log (arr)
// [1, 4]
ΣΗΜΑΝΤΙΚΟ Η λειτουργία "array.includes (...)" δεν υποστηρίζεται καθόλου στον Internet Explorer, στο Chrome πριν από την έκδοση 47, στον Firefox πριν από την έκδοση 43, στο Safari πριν από την 9 και στην έκδοση Edge πριν από 14, οπότε εδώ είναι το polyfill από το Mozilla.
Κατάργηση πολλαπλών στοιχείων (ίσως στο μέλλον)
Εάν η πρόταση "This-Binding Syntax" γίνεται ποτέ αποδεκτή, θα μπορείτε να το κάνετε αυτό:
// array-lib.js
λειτουργία εξαγωγής κατάργηση (... forDeletion) {
επιστρέψτε αυτό. φίλτρο (item =>! forDeletion. include (item))
}
// main.js
εισαγωγή {remove} από './array-lib.js'
let arr = [1, 2, 3, 4, 5, 3]
// :: Αυτή η δεσμευτική πρόταση σύνταξης
// χρησιμοποιώντας τη λειτουργία "κατάργηση" ως "εικονική μέθοδος"
// χωρίς επέκταση του Array.prototype
arr = arr :: αφαίρεση (2, 3, 5)
console.log (arr)
// [1, 4]
Δοκιμάστε το μόνοι σας στο BabelJS :)
Αναφορά
Συμπεριλαμβάνεται το Array.prototype.inc
Λειτουργική σύνθεση
|
Εξαρτάται από το αν θέλετε να διατηρήσετε ένα κενό σημείο ή όχι.
Εάν θέλετε μια κενή υποδοχή:
πίνακας [index] = μη καθορισμένος;
Εάν δεν θέλετε μια κενή υποδοχή:
// Για να διατηρήσετε το πρωτότυπο:
// oldArray = [... πίνακας];
// Αυτό τροποποιεί τον πίνακα.
array.splice (ευρετήριο, 1);
Και αν χρειάζεστε την τιμή αυτού του στοιχείου, μπορείτε απλώς να αποθηκεύσετε το στοιχείο του επιστρεφόμενου πίνακα:
var value = array.splice (ευρετήριο, 1) [0];
Εάν θέλετε να καταργήσετε και στα δύο άκρα του πίνακα, μπορείτε να χρησιμοποιήσετε το array.pop () για το τελευταίο ή το array.shift () για το πρώτο (και οι δύο επιστρέφουν επίσης την τιμή του στοιχείου).
Εάν δεν γνωρίζετε το ευρετήριο του στοιχείου, μπορείτε να χρησιμοποιήσετε το array.indexOf (item) για να το πάρετε (σε ένα if () για να λάβετε ένα στοιχείο ή σε λίγο () για να τα πάρετε όλα) Το array.indexOf (item) επιστρέφει είτε το ευρετήριο είτε -1 εάν δεν βρεθεί.
|
Ένας φίλος μου είχε προβλήματα στον Internet Explorer 8 και μου έδειξε τι έκανε. Του είπα ότι ήταν λάθος και μου είπε ότι είχε την απάντησηεδώ. Η τρέχουσα κορυφαία απάντηση δεν θα λειτουργεί σε όλα τα προγράμματα περιήγησης (για παράδειγμα ο Internet Explorer 8) και θα καταργήσει μόνο την πρώτη εμφάνιση του στοιχείου.
Καταργήστε ΟΛΕΣ τις παρουσίες από έναν πίνακα
function array_remove_index_by_value (arr, στοιχείο)
{
για (var i = arr.length; i--;)
{
if (arr [i] === item) {arr.splice (i, 1);}
}
}
Περιστρέφει μέσω του πίνακα προς τα πίσω (καθώς οι δείκτες και το μήκος θα αλλάξουν καθώς αφαιρούνται τα στοιχεία) και αφαιρεί το στοιχείο εάν βρεθεί. Λειτουργεί σε όλα τα προγράμματα περιήγησης.
|
Υπάρχουν δύο μεγάλες προσεγγίσεις:
splice (): anArray.splice (ευρετήριο, 1);
διαγραφή: διαγραφή anArray [ευρετήριο];
Να είστε προσεκτικοί όταν χρησιμοποιείτε διαγραφή για έναν πίνακα. Είναι καλό για τη διαγραφή χαρακτηριστικών αντικειμένων, αλλά όχι τόσο καλό για τις συστοιχίες. Είναι καλύτερα να χρησιμοποιείτε ματίσματος για συστοιχίες.
Λάβετε υπόψη ότι όταν χρησιμοποιείτε το delete για έναν πίνακα, θα μπορούσατε να έχετε λανθασμένα αποτελέσματα για το anArray.length. Με άλλα λόγια, η διαγραφή θα καταργούσε το στοιχείο, αλλά δεν θα ενημερώσει την τιμή της ιδιότητας μήκους
Μπορείτε επίσης να περιμένετε να υπάρχουν τρύπες στους αριθμούς ευρετηρίου μετά τη χρήση διαγραφής, π.χ. θα μπορούσατε να καταλήξετε να έχετε ευρετήρια 1, 3, 4, 8, 9 και 11 και μήκος όπως ήταν πριν από τη χρήση της διαγραφής. Σε αυτήν την περίπτωση, όλα τα ευρετήρια για βρόχους θα καταρρεύσουν, καθώς τα ευρετήρια δεν είναι πλέον διαδοχικά.
Εάν είστε αναγκασμένοι να χρησιμοποιήσετε τη διαγραφή για κάποιο λόγο, τότε θα πρέπει να χρησιμοποιείτε για κάθε βρόχο όταν πρέπει να κάνετε βρόχο μέσω συστοιχιών. Στην πραγματικότητα, αποφύγετε πάντα τη χρήση ευρετηρίου για βρόχους, εάν είναι δυνατόν. Με αυτόν τον τρόπο ο κώδικας θα ήταν πιο στιβαρός και λιγότερο επιρρεπής σε προβλήματα με ευρετήρια.
|
Array.prototype.remove_by_value = συνάρτηση (val) {
για (var i = 0; i  row.id === 5);
var remove = helper.remove (arr, row => row.name.startsWith («BMW»))
##Ορισμός
var helper = {
// Καταργήστε και επιστρέψτε την πρώτη εμφάνιση
removeOne: function (πίνακας, predicate) {
για (var i = 0; i  [2, 3, 4]
|
Μπορείτε να χρησιμοποιήσετε το ES6. Για παράδειγμα, για να διαγράψετε την τιμή "3" σε αυτήν την περίπτωση:
var array = ['1', '2', '3', '4', '5', '6']
var newArray = array.filter ((τιμή) => τιμή! = '3');
console.log (newArray);
Έξοδος:
["1", "2", "4", "5", "6"]
|
Αν θέλετε να αφαιρεθεί ένας νέος πίνακας με τις διαγραμμένες θέσεις, μπορείτε πάντα να διαγράψετε το συγκεκριμένο στοιχείο και να φιλτράρετε τον πίνακα. Μπορεί να χρειαστεί επέκταση του αντικειμένου του πίνακα για προγράμματα περιήγησης που δεν εφαρμόζουν τη μέθοδο φίλτρου, αλλά μακροπρόθεσμα είναι ευκολότερο αφού το μόνο που κάνετε είναι αυτό:
var my_array = [1, 2, 3, 4, 5, 6];
διαγραφή my_array [4];
console.log (my_array.filter (function (a) {return typeof a! == 'undefined';}));
Θα πρέπει να εμφανίζεται [1, 2, 3, 4, 6].
|
Ακολουθούν μερικοί τρόποι για να αφαιρέσετε ένα στοιχείο από έναν πίνακα χρησιμοποιώντας JavaScript.
Όλη η μέθοδος που περιγράφεται δεν μεταλλάσσει τον αρχικό πίνακα και αντ 'αυτού δημιουργεί μια νέα.
Εάν γνωρίζετε το ευρετήριο ενός αντικειμένου
Ας υποθέσουμε ότι έχετε έναν πίνακα και θέλετε να αφαιρέσετε ένα στοιχείο στη θέση i.
Μια μέθοδος είναι να χρησιμοποιήσετε το slice ():
const item = ['a', 'b', 'c', 'd', 'e', ​​'f']
const i = 3
const filteredItems = items.slice (0, i) .concat (items.slice (i + 1, item.length))
console.log (φιλτραρισμένα στοιχεία)
slice () δημιουργεί έναν νέο πίνακα με τα ευρετήρια που λαμβάνει. Δημιουργούμε απλώς έναν νέο πίνακα, από την αρχή έως το ευρετήριο που θέλουμε να αφαιρέσουμε και συνδυάζουμε έναν άλλο πίνακα από την πρώτη θέση μετά από αυτόν που καταργήσαμε στο τέλος του πίνακα.
Εάν γνωρίζετε την αξία
Σε αυτήν την περίπτωση, μια καλή επιλογή είναι να χρησιμοποιήσετε το φίλτρο (), το οποίο προσφέρει μια πιο δηλωτική προσέγγιση:
const item = ['a', 'b', 'c', 'd', 'e', ​​'f']
const valueToRemove = 'c'
const filteredItems = items.filter (item => item! == valueToRemove)
console.log (φιλτραρισμένα στοιχεία)
Αυτό χρησιμοποιεί τις λειτουργίες βέλους ES6. Μπορείτε να χρησιμοποιήσετε τις παραδοσιακές λειτουργίες για την υποστήριξη παλαιότερων προγραμμάτων περιήγησης:
const item = ['a', 'b', 'c', 'd', 'e', ​​'f']
const valueToRemove = 'c'
const filteredItems = items.filter (λειτουργία (στοιχείο) {
επιστρέψτε το στοιχείο! == valueToRemove
})
console.log (φιλτραρισμένα στοιχεία)
Ή μπορείτε να χρησιμοποιήσετε το Babel και να μεταφέρετε τον κωδικό ES6 πίσω στο ES5 για να το κάνετε πιο εύπεπτο στα παλιά προγράμματα περιήγησης, αλλά γράψτε σύγχρονο JavaScript στον κώδικά σας
Κατάργηση πολλών στοιχείων
Τι γίνεται αν αντί για ένα στοιχείο, θέλετε να καταργήσετε πολλά στοιχεία;
Ας βρούμε την απλούστερη λύση.
Κατά ευρετήριο
Μπορείτε απλά να δημιουργήσετε μια συνάρτηση και να καταργήσετε στοιχεία σε σειρά:
const item = ['a', 'b', 'c', 'd', 'e', ​​'f']
const removeItem = (αντικείμενα, i) =>
items.slice (0, i-1) .concat (items.slice (i, items.length))
let filteredItems = removeItem (στοιχεία, 3)
filteredItems = removeItem (filteredItems, 5)
//["Α Β Γ Δ"]
console.log (φιλτραρισμένα στοιχεία)
Κατά αξία
Μπορείτε να αναζητήσετε συμπερίληψη στη λειτουργία επανάκλησης:
const item = ['a', 'b', 'c', 'd', 'e', ​​'f']
const ValuesToRemove = ['c', 'd']
const filteredItems = items.filter (item =>! ValuesToRemove.includes (στοιχείο)
// ["a", "b", "e", "f"]
console.log (φιλτραρισμένα στοιχεία)
Αποφύγετε τη μετάλλαξη του αρχικού πίνακα
το splice () (δεν πρέπει να συγχέεται με το slice ()) μεταλλάσσει τον αρχικό πίνακα και θα πρέπει να αποφεύγεται.
(αρχικά δημοσιεύτηκε στον ιστότοπό μου https://flaviocopes.com/how-to-remove-item-from-array/)
|
Δείτε αυτόν τον κωδικό. Λειτουργεί σε κάθε μεγάλο πρόγραμμα περιήγησης.
remove_item = συνάρτηση (arr, τιμή) {
var b = ";
για (b σε arr) {
εάν (arr [b] === τιμή) {
arr.splice (b, 1);
Διακοπή;
}
}
επιστροφή arr;
};
Καλέστε αυτήν τη λειτουργία
remove_item (πίνακας, τιμή);
|
ES6 & χωρίς μετάλλαξη: (Οκτώβριος 2016)
const removeByIndex = (λίστα, ευρετήριο) =>
[
... list.slice (0, ευρετήριο),
... list.slice (ευρετήριο + 1)
];
έξοδος = removeByIndex ([33,22,11,44], 1) // => [33,11,44]
console.log (έξοδος)
|
Μπορείτε να χρησιμοποιήσετε lodash _.pull (mutate array), _.pullAt (mutate array) ή _.without (δεν μεταλλάσσει πίνακα)
var array1 = ['a', 'b', 'c', 'd']
_. pull (array1, 'c')
console.log (array1) // ['a', 'b', 'd']
var array2 = ['e', 'f', 'g', 'h']
_.pullAt (πίνακας2, 0)
console.log (array2) // ['f', 'g', 'h']
var array3 = ['i', 'j', 'k', 'l']
var newArray = _.without (array3, 'i') // ['j', 'k', 'l']
console.log (array3) // ['i', 'j', 'k', 'l']
|
Η αφαίρεση ενός συγκεκριμένου στοιχείου / συμβολοσειράς από έναν πίνακα μπορεί να γίνει σε μια επένδυση:
τοArray.splice (theArray.indexOf ("stringToRemoveFromArray"), 1);
όπου:
theArray: ο πίνακας από τον οποίο θέλετε να καταργήσετε κάτι συγκεκριμένο
stringToRemoveFromArray: η συμβολοσειρά που θέλετε να καταργήσετε και 1 είναι ο αριθμός των στοιχείων που θέλετε να καταργήσετε.
ΣΗΜΕΙΩΣΗ: Εάν το "stringToRemoveFromArray" δεν βρίσκεται στον πίνακα σας, αυτό θα καταργήσει το τελευταίο στοιχείο του πίνακα.
Είναι πάντα καλή πρακτική να ελέγχετε αν το στοιχείο υπάρχει στον πίνακα σας πρώτα, πριν το αφαιρέσετε.
if (theArray.indexOf ("stringToRemoveFromArray")> = 0) {
τοArray.splice (theArray.indexOf ("stringToRemoveFromArray"), 1);
}
Εάν έχετε πρόσβαση σε νεότερες εκδόσεις Ecmascript στους υπολογιστές του πελάτη σας (ΠΡΟΕΙΔΟΠΟΙΗΣΗ, ενδέχεται να μην λειτουργεί σε παλαιότερους σταθμούς)
var array = ['1', '2', '3', '4', '5', '6']
var newArray = array.filter ((τιμή) => τιμή! = '3');
Όπου «3» είναι η τιμή που θέλετε να καταργήσετε από τον πίνακα.
Ο πίνακας θα γίνει τότε: ['1', '2', '4', '5', '6']
|
Εντάξει, για παράδειγμα έχετε τον παρακάτω πίνακα:
var num = [1, 2, 3, 4, 5];
Και θέλουμε να διαγράψουμε τον αριθμό 4. Μπορείτε απλά να χρησιμοποιήσετε τον παρακάτω κώδικα:
num.splice (num.indexOf (4), 1); // ο αριθμός θα είναι [1, 2, 3, 5];
Εάν επαναχρησιμοποιείτε αυτήν τη λειτουργία, γράφετε μια επαναχρησιμοποιήσιμη συνάρτηση που θα επισυνάπτεται στη συνάρτηση εγγενών συστοιχιών όπως παρακάτω:
Array.prototype.remove = Array.prototype.remove || συνάρτηση (x) {
const i = this.indexOf (x);
αν (i === - 1)
ΕΠΙΣΤΡΟΦΗ;
this.splice (i, 1) · // num.remove (5) === [1, 2, 3];
}
Τι γίνεται όμως αν έχετε τον παρακάτω πίνακα αντί με μερικά [5] s στον πίνακα;
var num = [5, 6, 5, 4, 5, 1, 5];
Χρειαζόμαστε ένα βρόχο για να τα ελέγξουμε όλα, αλλά ένας ευκολότερος και πιο αποτελεσματικός τρόπος είναι η χρήση ενσωματωμένων λειτουργιών JavaScript, οπότε γράφουμε μια συνάρτηση που χρησιμοποιεί ένα φίλτρο όπως παρακάτω:
const _removeValue = (arr, x) => arr.filter (n => n! == x);
// _ removeValue ([1, 2, 3, 4, 5, 5, 6, 5], 5) // Επιστροφή [1, 2, 3, 4, 6]
Επίσης υπάρχουν βιβλιοθήκες τρίτων που σας βοηθούν να το κάνετε αυτό, όπως το Lodash ή το Underscore. Για περισσότερες πληροφορίες, δείτε το lodash _.pull, _.pullAt ή _.without.
|
Εκτέλεση
Σήμερα (2019-12-09) Πραγματοποιώ δοκιμές απόδοσης στο macOS v10.13.6 (High Sierra) για επιλεγμένες λύσεις. Δείχνω διαγραφή (A), αλλά δεν το χρησιμοποιώ σε σύγκριση με άλλες μεθόδους, γιατί άφησε κενό χώρο στον πίνακα.
Τα συμπεράσματα
η πιο γρήγορη λύση είναι το array.splice (C) (εκτός από το Safari για μικρές συστοιχίες όπου έχει τη δεύτερη φορά)
για μεγάλες συστοιχίες, το array.slice + splice (H) είναι η ταχύτερα αμετάβλητη λύση για Firefox και Safari. Το Array.from (B) είναι το ταχύτερο στο Chrome
Οι μεταβλητές λύσεις είναι συνήθως 1,5x-6x γρηγορότερες από τις αμετάβλητες
για μικρούς πίνακες στο Safari, εκπληκτικά η μεταβλητή λύση (C) είναι πιο αργή από την αμετάβλητη λύση (G)
Λεπτομέριες
Στις δοκιμές αφαιρώ το μεσαίο στοιχείο από τον πίνακα με διαφορετικούς τρόπους. Οι λύσεις A, C είναι διαθέσιμες. Οι λύσεις B, D, E, F, G, H είναι αμετάβλητες.
Αποτελέσματα για πίνακα με 10 στοιχεία
Στο Chrome, το array.splice (C) είναι η ταχύτερη επί τόπου λύση. Το array.filter (D) είναι η ταχύτερα αμετάβλητη λύση. Το πιο αργό είναι το array.slice (F). Μπορείτε να πραγματοποιήσετε τη δοκιμή στο μηχάνημά σας εδώ.
Αποτελέσματα για πίνακα με 1.000.000 στοιχεία
Στο Chrome το array.splice (C) είναι η ταχύτερη επί τόπου λύση (η διαγραφή (C) είναι παρόμοια γρήγορη - αλλά άφησε μια κενή υποδοχή στη συστοιχία (οπότε δεν εκτελεί "πλήρη κατάργηση")) Το array.slice-splice (H) είναι η ταχύτερα αμετάβλητη λύση. Το πιο αργό είναι το array.filter (D και E). Μπορείτε να πραγματοποιήσετε τη δοκιμή στο μηχάνημά σας εδώ.
var a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var log = (letter, array) => console.log (letter, array.join `,`);
συνάρτηση A (πίνακας) {
var index = array.indexOf (5);
διαγραφή πίνακα [ευρετήριο];
log ('A', πίνακας);
}
συνάρτηση B (πίνακας) {
var index = array.indexOf (5);
var arr = Array.from (πίνακας);
arr.splice (ευρετήριο, 1)
log («B», arr);
}
συνάρτηση C (πίνακας) {
var index = array.indexOf (5);
array.splice (ευρετήριο, 1);
log ('C', πίνακας);
}
συνάρτηση D (πίνακας) {
var arr = array.filter (item => item! == 5)
log ('D', arr);
}
συνάρτηση E (πίνακας) {
var index = array.indexOf (5);
var arr = array.filter ((αντικείμενο, i) => i! == ευρετήριο)
log ('E', arr);
}
συνάρτηση F (πίνακας) {
var index = array.indexOf (5);
var arr = array.slice (0, index) .concat (array.slice (index + 1))
log ('F', arr);
}
συνάρτηση G (πίνακας) {
var index = array.indexOf (5);
var arr = [... array.slice (0, ευρετήριο), ... array.slice (ευρετήριο + 1)]
log ('G', arr);
}
συνάρτηση H (πίνακας) {
var index = array.indexOf (5);
var arr = array.slice (0);
arr.splice (ευρετήριο, 1);
log («Η», arr);
}
Α ([... a]);
Β ([... a]);
Γ ([... a]);
Δ ([... a]);
Ε ([... a]);
Φά]);
G ([... a]);
Η ([... a]);
Αυτό το απόσπασμα παρουσιάζει μόνο κώδικα που χρησιμοποιείται σε δοκιμές απόδοσης - δεν εκτελεί τις ίδιες τις δοκιμές.
Σύγκριση για προγράμματα περιήγησης: Chrome v78.0.0, Safari v13.0.4 και Firefox v71.0.0
|
Είμαι αρκετά νέος στο JavaScript και χρειάζομαι αυτήν τη λειτουργικότητα. Απλώς έγραψα αυτό:
λειτουργία removeFromArray (πίνακας, στοιχείο, ευρετήριο) {
ενώ ((index = array.indexOf (item))> -1) {
array.splice (ευρετήριο, 1);
}
}
Στη συνέχεια, όταν θέλω να το χρησιμοποιήσω:
// Ρυθμίστε ορισμένα εικονικά δεδομένα
var dummyObj = {όνομα: "meow"};
var dummyArray = [dummyObj, "item1", "item1", "item2"];
// Αφαιρέστε τα εικονικά δεδομένα
removeFromArray (dummyArray, dummyObj);
removeFromArray (dummyArray, "item2");
Έξοδος - Όπως αναμενόταν.
["item1", "item1"]
Μπορεί να έχετε διαφορετικές ανάγκες από εμένα, ώστε να μπορείτε εύκολα να το τροποποιήσετενα τους ταιριάζει. Ελπίζω ότι αυτό βοηθάει κάποιον.
|
Εάν έχετε σύνθετα αντικείμενα στη συστοιχία μπορείτε να χρησιμοποιήσετε φίλτρα;
Σε καταστάσεις όπου το $ .inArray ή το array.splice δεν είναι τόσο εύκολο στη χρήση. Ειδικά αν τα αντικείμενα είναι ίσως ρηχά στον πίνακα.
Π.χ. εάν έχετε ένα αντικείμενο με ένα πεδίο Id και θέλετε το αντικείμενο να αφαιρεθεί από έναν πίνακα:
this.array = this.array.filter (συνάρτηση (στοιχείο, i) {
return element.id! == idToRemove;
});
|
Θέλω να απαντήσω με βάση το ECMAScript 6. Ας υποθέσουμε ότι έχετε έναν πίνακα όπως παρακάτω:
ας arr = [1,2,3,4];
Εάν θέλετε να διαγράψετε σε ένα ειδικό ευρετήριο όπως το 2, γράψτε τον παρακάτω κώδικα:
arr.splice (2, 1); // => το arr έγινε [1,2,4]
Αλλά αν θέλετε να διαγράψετε ένα ειδικό στοιχείο όπως το 3 και δεν γνωρίζετε το ευρετήριό του, κάντε τα εξής:
arr = arr.filter (e => e! == 3); // => το arr έγινε [1,2,4]
Συμβουλή: χρησιμοποιήστε μια λειτουργία βέλους για επιστροφή κλήσης φίλτρου, εκτός εάν λάβετε έναν κενό πίνακα
|
Ενημέρωση: Αυτή η μέθοδος συνιστάται μόνο εάν δεν μπορείτε να χρησιμοποιήσετε το ECMAScript 2015 (παλαιότερα γνωστό ως ES6). Εάν μπορείτε να το χρησιμοποιήσετε, άλλες απαντήσεις εδώ παρέχουν πολύ πιο όμορφες εφαρμογές.
Αυτή η ουσία εδώ θα λύσει το πρόβλημά σας και θα διαγράψει επίσης όλες τις εμφανίσεις του ορίσματος αντί μόνο 1 (ή μια καθορισμένη τιμή).
Array.prototype.destroy = συνάρτηση (obj) {
// Επιστρέψτε το null εάν δεν βρέθηκαν αντικείμενα και αφαιρέθηκαν
var κατεστραμμένο = μηδέν;
για (var i = 0; i  3
x.destroy (ψευδές); // => ψευδές
Χ; // => [1, 2, true, undefined]
x.destroy (αληθινό); // => αλήθεια
x.destroy (απροσδιόριστο); // => απροσδιόριστο
Χ; // => [1, 2]
x.destroy (3); // => μηδέν
Χ; // => [1, 2]
|
Ενημέρωση ES10
Αυτή η ανάρτηση συνοψίζει τις κοινές προσεγγίσεις για την αφαίρεση στοιχείων από τον πίνακα από το ECMAScript 2019 (ES10).
1. Γενικές υποθέσεις
1.1. Κατάργηση στοιχείου συστοιχίας κατά τιμή χρησιμοποιώντας .splice ()
| Επιτόπου: Ναι |
| Καταργεί διπλότυπα: Ναι (βρόχος), Όχι (indexOf) |
| Κατά αξία / δείκτη: Κατά δείκτη |
Εάν γνωρίζετε την τιμή που θέλετε να καταργήσετε από έναν πίνακα, μπορείτε να χρησιμοποιήσετε τη μέθοδο συναρμολόγησης. Πρώτα πρέπει να προσδιορίσετε το ευρετήριο του αντικειμένου στόχου. Στη συνέχεια, χρησιμοποιείτε το ευρετήριο ως στοιχείο εκκίνησης και καταργείτε μόνο ένα στοιχείο.
// Με βρόχο «για»
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
για (let i = 0; i  [1, 2, 3, 4, 6, 7, 8, 9, 0]
// Με τη μέθοδο .indexOf ()
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
const i = arr.indexOf (5);
arr.splice (i, 1); // => [1, 2, 3, 4, 6, 7, 8, 9, 0]
1.2. Αφαίρεση στοιχείου συστοιχίας χρησιμοποιώντας τη μέθοδο .filter ()
| Επιτόπου: Όχι |
| Καταργεί διπλότυπα: Ναι |
| Κατά αξία / δείκτη: Κατά τιμή |
Το συγκεκριμένο στοιχείο μπορεί να φιλτραριστεί από πίνακα, παρέχοντας λειτουργία φιλτραρίσματος. Τέτοια συνάρτηση τότε απαιτείται για κάθε στοιχείο σε πίνακα.
τιμή const = 3
let arr = [1, 2, 3, 4, 5, 3]
arr = arr.filter (item => item! == τιμή)
console.log (arr)
// [1, 2, 4, 5]
1.3. Αφαίρεση στοιχείου Array επεκτείνοντας το Array.prototype
| Επιτόπου: Ναι / Όχι (Εξαρτάται από την εφαρμογή) |
| Καταργεί διπλότυπα: Ναι / Όχι (Εξαρτάται από την εφαρμογή) |
| Κατά αξία / δείκτη: Κατά ευρετήριο / Κατά αξία (Εξαρτάται από την εφαρμογή) |
Το πρωτότυπο του Array μπορεί να επεκταθεί με πρόσθετες μεθόδους. Τέτοιες μέθοδοι θα είναι στη συνέχεια διαθέσιμες για χρήση σε δημιουργημένες συστοιχίες.
Σημείωση: Η επέκταση των πρωτοτύπων των αντικειμένων από την τυπική βιβλιοθήκη του JavaScript (όπως το Array) θεωρείται από ορισμένους ως αντίθετο.
// Επιτόπου, καταργεί όλα, με εφαρμογή αξίας
Array.prototype.remove = συνάρτηση (στοιχείο) {
για (let i = 0; i  = ES10)
| Επιτόπου: Όχι |
| Καταργεί διπλότυπα: Ναι |
| Κατά αξία / δείκτη: Κατά τιμή |
Το ES10 παρουσίασε το Object.fromEntries, το οποίο μπορεί να είναιχρησιμοποιείται για τη δημιουργία επιθυμητής συστοιχίας από οποιοδήποτε αντικείμενο που μοιάζει με συστοιχία και φιλτράρισμα ανεπιθύμητων στοιχείων κατά τη διάρκεια της διαδικασίας.
αντικείμενο const = [1,2,3,4];
const valueToRemove = 3;
const arr = Object.values ​​(Object.fromEntries (
Object.entries (αντικείμενο)
.filter (([key, val]) => val! == valueToRemove)
))
console.log (arr); // [1,2,4]
2. Ειδικές περιπτώσεις
2.1 Αφαίρεση στοιχείου εάν είναι στο τέλος της συστοιχίας
2.1.1. Αλλαγή του μήκους της σειράς
| Επιτόπου: Ναι |
| Καταργεί διπλότυπα: Όχι |
| Κατά τιμή / δείκτη: Δ / Υ |
Τα στοιχεία της σειράς JavaScript μπορούν να αφαιρεθούν από το τέλος ενός πίνακα, ορίζοντας την ιδιότητα μήκους σε τιμή μικρότερη από την τρέχουσα τιμή. Κάθε στοιχείο του οποίου ο δείκτης είναι μεγαλύτερος ή ίσος με το νέο μήκος θα αφαιρεθεί.
const arr = [1, 2, 3, 4, 5, 6];
arr.length = 5; // Ρυθμίστε το μήκος για να αφαιρέσετε το στοιχείο
console.log (arr); // [1, 2, 3, 4, 5]
2.1.2. Χρησιμοποιώντας τη μέθοδο .pop ()
| Επιτόπου: Ναι |
| Καταργεί διπλότυπα: Όχι |
| Κατά τιμή / δείκτη: Δ / Υ |
Η μέθοδος pop αφαιρεί το τελευταίο στοιχείο του πίνακα, επιστρέφει αυτό το στοιχείο και ενημερώνει την ιδιότητα μήκους. Η μέθοδος pop τροποποιεί τον πίνακα στον οποίο καλείται. Αυτό σημαίνει ότι σε αντίθεση με τη χρήση διαγραφής το τελευταίο στοιχείο αφαιρείται εντελώς και το μήκος του πίνακα μειώνεται.
const arr = [1, 2, 3, 4, 5, 6];
arr.pop (); // επιστρέφει 6
console.log (arr); // [1, 2, 3, 4, 5]
2.2. Κατάργηση στοιχείου εάν είναι στην αρχή του πίνακα
| Επιτόπου: Ναι |
| Καταργεί διπλότυπα: Όχι |
| Κατά τιμή / δείκτη: Δ / Υ |
Η μέθοδος .shift () λειτουργεί σαν τη μέθοδο pop, εκτός από την αφαίρεση του πρώτου στοιχείου ενός πίνακα JavaScript αντί του τελευταίου. Όταν το στοιχείο αφαιρεθεί, τα υπόλοιπα στοιχεία μετακινούνται προς τα κάτω.
const arr = [1, 2, 3, 4];
arr.shift (); // επιστρέφει 1
console.log (arr); // [2, 3, 4]
2.3. Κατάργηση στοιχείου εάν είναι το μοναδικό στοιχείο στη συστοιχία
| Επιτόπου: Ναι |
| Καταργεί τα διπλά: N / A |
| Κατά τιμή / δείκτη: Δ / Υ |
Η πιο γρήγορη τεχνική είναι να ορίσετε μια μεταβλητή πίνακα σε έναν κενό πίνακα.
ας arr = [1];
arr = []; // κενός πίνακας
Εναλλακτικά, μπορεί να χρησιμοποιηθεί τεχνική από το 2.1.1 ρυθμίζοντας το μήκος σε 0.
|
Δεν πρέπει ποτέ να μεταλλάξετε τον πίνακα σας. Καθώς αυτό είναι αντίθετο με το λειτουργικό σχέδιο προγραμματισμού. Μπορείτε να δημιουργήσετε έναν νέο πίνακα χωρίς να αναφέρετε τον πίνακα που θέλετε να αλλάξετε τα δεδομένα χρησιμοποιώντας το φίλτρο μεθόδου ECMAScript 6.
var myArray = [1, 2, 3, 4, 5, 6];
Ας υποθέσουμε ότι θέλετε να αφαιρέσετε 5 από τον πίνακα, μπορείτε απλά να το κάνετε έτσι:
myArray = myArray.filter (τιμή => τιμή! == 5);
Αυτό θα σας δώσει έναν νέο πίνακα χωρίς την τιμή που θέλετε να καταργήσετε. Έτσι το αποτέλεσμα θα είναι:
[1, 2, 3, 4, 6]; Το // 5 καταργήθηκε από αυτόν τον πίνακα
Για περαιτέρω κατανόηση μπορείτε να διαβάσετε την τεκμηρίωση MDN στο Array.filter.
|
Μια πιο σύγχρονη προσέγγιση ECMAScript 2015 (παλαιότερα γνωστή ως Harmony ή ES 6). Δεδομένος:
στοιχεία const = [1, 2, 3, 4];
const index = 2;
Τότε:
items.filter ((x, i) => i! == ευρετήριο);
Ενδοτικότητα:
[1, 2, 4]
Μπορείτε να χρησιμοποιήσετε το Babel και μια υπηρεσία polyfill για να βεβαιωθείτε ότι αυτό υποστηρίζεται καλά σε προγράμματα περιήγησης.
|
Μπορείτε να κάνετε έναν βρόχο προς τα πίσω για να βεβαιωθείτε ότι δεν θα βιδώσετε τα ευρετήρια, εάν υπάρχουν πολλές παρουσίες του στοιχείου.
var myElement = "σοκολάτα";
var myArray = ['σοκολάτα', 'poptart', 'poptart', 'poptart', 'σοκολάτα', 'poptart', 'poptart', 'σοκολάτα'];
/ * Σημαντικός κωδικός * /
για (var i = myArray.length - 1; i> = 0; i--) {
εάν (myArray [i] == myElement) myArray.splice (i, 1);
}
console.log (myArray);
Ζωντανή επίδειξη
|
Έχετε 1 έως 9 στον πίνακα και θέλετε να καταργήσετε το 5. Χρησιμοποιήστε τον παρακάτω κώδικα:
var numberArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var newNumberArray = numberArray.filter (m => {
επιστροφή m! == 5;
});
console.log ("new Array, 5 remove", newNumberArray);
Αν θέλετε πολλές τιμές. Παράδειγμα: - 1,7,8
var numberArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var newNumberArray = numberArray.filter (m => {
επιστροφή (m! == 1) && (m! == 7) && (m! == 8);
});
console.log ("new Array, 1,7 and 8 remove", newNumberArray);
Εάν θέλετε να καταργήσετε μια τιμή πίνακα σε έναν πίνακα. Παράδειγμα: [3,4,5]
var numberArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var removebleArray = [3,4,5];
var newNumberArray = numberArray.filter (m => {
επιστροφή! removebleArray. include (m);
});
console.log ("new Array, [3,4,5] remove", newNumberArray);
Περιλαμβάνει υποστηριζόμενο πρόγραμμα περιήγησης είναι σύνδεσμος.
|
1
2
3
4
Επόμενο
Πολύ ενεργή ερώτηση. Κερδίστε 10 φήμη για να απαντήσετε σε αυτήν την ερώτηση. Η απαίτηση φήμης συμβάλλει στην προστασία αυτής της ερώτησης από ανεπιθύμητες ενέργειες και μη απαντήσεις.
Δεν είναι η απάντηση που ψάχνετε; Περιηγηθείτε σε άλλες ερωτήσεις με συστοιχίες javascript με ετικέτα ή κάντε τη δική σας ερώτηση.